From 8f33ca9931de5a799cb3fab795ee5a49072a20c8 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Wed, 5 Jul 2006 17:16:10 +0100 Subject: [PATCH] [XEN] Hypercall-init dom0_op takes GMFN, not MFN. Signed-off-by: Steven Smith --- tools/libxc/xc_linux_build.c | 3 ++- xen/arch/x86/dom0_ops.c | 10 ++++++---- xen/include/public/dom0_ops.h | 4 ++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/tools/libxc/xc_linux_build.c b/tools/libxc/xc_linux_build.c index 8913124e74..9b5f38c84a 100644 --- a/tools/libxc/xc_linux_build.c +++ b/tools/libxc/xc_linux_build.c @@ -1053,7 +1053,8 @@ static int setup_guest(int xc_handle, if ( hypercall_pfn >= nr_pages ) goto error_out; op.u.hypercall_init.domain = (domid_t)dom; - op.u.hypercall_init.mfn = page_array[hypercall_pfn]; + op.u.hypercall_init.gmfn = shadow_mode_enabled ? + hypercall_pfn : page_array[hypercall_pfn]; op.cmd = DOM0_HYPERCALL_INIT; if ( xc_dom0_op(xc_handle, &op) ) goto error_out; diff --git a/xen/arch/x86/dom0_ops.c b/xen/arch/x86/dom0_ops.c index c43d62b410..1a2f9aa303 100644 --- a/xen/arch/x86/dom0_ops.c +++ b/xen/arch/x86/dom0_ops.c @@ -407,15 +407,17 @@ long arch_do_dom0_op(struct dom0_op *op, XEN_GUEST_HANDLE(dom0_op_t) u_dom0_op) case DOM0_HYPERCALL_INIT: { - struct domain *d; - unsigned long mfn = op->u.hypercall_init.mfn; + struct domain *d = find_domain_by_id(op->u.hypercall_init.domain); + unsigned long gmfn = op->u.hypercall_init.gmfn; + unsigned long mfn; void *hypercall_page; ret = -ESRCH; - if ( unlikely((d = find_domain_by_id( - op->u.hypercall_init.domain)) == NULL) ) + if ( unlikely(d == NULL) ) break; + mfn = gmfn_to_mfn(d, gmfn); + ret = -EACCES; if ( !mfn_valid(mfn) || !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) ) diff --git a/xen/include/public/dom0_ops.h b/xen/include/public/dom0_ops.h index d80e0ea1eb..a95814bacd 100644 --- a/xen/include/public/dom0_ops.h +++ b/xen/include/public/dom0_ops.h @@ -509,8 +509,8 @@ DEFINE_XEN_GUEST_HANDLE(dom0_iomem_permission_t); #define DOM0_HYPERCALL_INIT 48 struct dom0_hypercall_init { - domid_t domain; /* domain to be affected */ - xen_pfn_t mfn; /* machine frame to be initialised */ + domid_t domain; /* domain to be affected */ + xen_pfn_t gmfn; /* GMFN to be initialised */ }; typedef struct dom0_hypercall_init dom0_hypercall_init_t; DEFINE_XEN_GUEST_HANDLE(dom0_hypercall_init_t); -- 2.30.2